package com.github.netty.day03_FastThreadLocal;

import io.netty.util.concurrent.FastThreadLocal;
import io.netty.util.concurrent.FastThreadLocalThread;
import java.util.concurrent.atomic.AtomicInteger;


/**
 *
 * FastThreadLocal和ThreadLocal的区别：
 * 本质都是将所谓的《map》动作交给了Thread。
 * 传统的Thread在内存中存了一个Entry[]，entry的key为ThreadLocal内置的hash，以0x61c88647递增，能保证更均匀分布，value是存储的值，
 * ThreadLocal 使用的是hash+拉链法，在Entry[]中寻找可插入的地方，找不到就线性向下寻找空白位置插入。
 *
 * FastThreadLocal采用的是空间换时间的方法，每增加一个FastThreadLocal则index自增1，并将index维护在FastThreadLocal中。
 * 这样，在寻址的时候，直接根据index进行寻址即可。
 *
 * 传统的优点是占用空间相对小，只有使用了才占用空间，缺点就是线性寻址慢，
 * Fast优点就是寻址快，缺点就是占用空间大。
 *
 * 大家使用的时候 有所取舍即可。
 */
public class FastThreadLocalTest {


  private FastThreadLocal<AtomicInteger> threadLocal = new FastThreadLocal<>();

  public static void main(String[] args) throws InterruptedException {
    FastThreadLocalTest test = new FastThreadLocalTest();
    test.doSomeBiz(() -> {
      System.out.println("doSomeBiz");
    });

    Thread.sleep(1000);

  }


  public void doSomeBiz(Runnable runnable) {
    FastThreadLocalThread thread = new FastThreadLocalThread(() -> {
      AtomicInteger atomicInteger = threadLocal.get();
      if (atomicInteger == null) {
        atomicInteger = new AtomicInteger(1);
        threadLocal.set(atomicInteger);
        System.out.println("输出：" + atomicInteger.get());
      } else {
        atomicInteger.incrementAndGet();
        System.out.println("自增：" + atomicInteger.get());
      }

      runnable.run();
    });
    thread.start();

  }

}
